import { zh_CN, Faker } from '@faker-js/faker';

const customFaker = new Faker({ locale: zh_CN });

/**
 * 生成一个随机车牌号
 * @returns
 */
export const randomCarNumber = () => {
  const provinces = '京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼';
  const province = customFaker.helpers.arrayElement(provinces.split(''));
  const letter = customFaker.helpers.arrayElement('ABCDEFGHJKLMNPQRSTUVWXYZ'.split(''));
  const number = customFaker.number.int({ min: 0, max: 99999 }).toString().padStart(5, '0');
  return `${province}${letter}${number}`;
};

/**
 * 将Date类型转换为YYYY-MM-DD格式或者YYYY-MM-DD HH:mm:ss格式
 * @param dateTime Date类型的时间
 * @param isDateTime 是否需要时分秒，默认为false
 * @returns
 */
export const formatDateTime = (dateTime: Date, isDateTime: boolean = false) => {
  if (isDateTime) {
    const date = dateTime.toISOString().replace('T', ' ').split('.')[0];
    return date.slice(0, date.lastIndexOf(':'));
  } else {
    return dateTime.toISOString().split('T')[0];
  }
};

/**
 * 生成一个随机的UUID
 * @param length 生成的随机字符串长度，默认为16
 * @returns
 */
export const generateId = (length: number = 16) => {
  const timestamp = Date.now().toString(36);
  const array = new Uint8Array(length);
  crypto.getRandomValues(array);
  return timestamp + Array.from(array, (byte) => byte.toString(36).padStart(2, '0')).join('');
};

/**
 * 将秒数转换为时分秒格式
 * @param s 秒数
 * @param nullStr 传参为空时的返回值，默认为'--'
 * @returns 格式化的时间字符串，可能的格式包括"hh小时mm分ss秒"、"mm分ss秒"或"ss秒"。如果s为null或undefined，则返回nullStr
 */
export const formatSeconds = (s: number | null | undefined, nullStr: string = '--') => {
  return s === void 0 || s === null
    ? nullStr
    : [Math.floor(s / 3600), Math.floor(s / 60) % 60, s % 60]
        .map((t, i) => t.toString().padStart(2, '0') + ['小时', '分', '秒'][i])
        .join('')
        .replace(/^0{2}小时0{2}分/, '')
        .replace(/^0{2}小时/, '');
};
